package com.digital.welcome.util;

import com.digital.welcome.entity.User;
import org.apache.poi.poifs.filesystem.FileMagic;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class ExcelDataUtil {
    public static List<User> userExcelDataRead(File file) throws IOException {
        FileInputStream inputStream = new FileInputStream(file);
        //通过poi解析流 XSSFWorkbook 处理流得到的对象中 就封装了xlsx文件所有的数据
        XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
        List<User> userList = new ArrayList<>();
        //从文件中获取表对象  getSheetAt通过下标获取
        XSSFSheet sheet = workbook.getSheetAt(0);

        //从表中获取到行数据  从第二行开始 到 最后一行  getLastRowNum() 获取最后一行的下标
        int lastRowNum = sheet.getLastRowNum();
        for (int i = 1; i <= lastRowNum; i++) {
            //通过下标获取行
            XSSFRow row = sheet.getRow(i);

//            封装到对象中
            User user = new User();
            user.setUserName(String.valueOf(Math.round(row.getCell(1).getNumericCellValue())));
            if (user.getUserName() == null || "0".equals(user.getUserName()) || "".equals(user.getUserName())) {
                break;
            }
            try {
                user.setUserPassword(String.valueOf(row.getCell(2).getNumericCellValue()));
            } catch (Exception ignored) {
                user.setUserPassword(row.getCell(2).getStringCellValue());
            }
            try {
                user.setIdentity(String.valueOf(row.getCell(5).getNumericCellValue()));
            } catch (Exception ignored) {
                user.setIdentity(row.getCell(5).getStringCellValue());
            }
            user.setName(row.getCell(3).getStringCellValue());
            user.setPhone(row.getCell(4).getStringCellValue());

            user.setSex(row.getCell(6).getStringCellValue());
            user.setEmail(row.getCell(7).getStringCellValue());
            user.setProvince(row.getCell(9).getStringCellValue());
            user.setCategory(row.getCell(10).getStringCellValue());
            user.setAddress(row.getCell(11).getStringCellValue());
            user.setPolitical(row.getCell(12).getStringCellValue());
            user.setCollege(row.getCell(13).getStringCellValue());
            user.setMajor(row.getCell(14).getStringCellValue());
            user.setClasses(row.getCell(15).getStringCellValue());
//            将对象添加数据库
            userList.add(user);
        }
        return userList;
    }

    public static boolean isExcelFile(InputStream inputStream)//判断后缀为xlsx
    {
        boolean result = false;
        try {
            //FileMagic.OLE2表示xls格式 FileMagic.OOXML表示xlsx格式
            FileMagic fileMagic = FileMagic.valueOf(inputStream);
            if (Objects.equals(fileMagic, FileMagic.OOXML)) {
                result = true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    public static File multipartFileToFile(MultipartFile file) throws Exception {

        File toFile;
        if (ObjectUtils.isEmpty(file) || file.getSize() <= 0) {
            return null;
        } else {
            toFile = new File("./temp/" + file.getOriginalFilename());// 获得文件名
            System.out.println(toFile.getCanonicalPath());
            if (!toFile.isFile()) {
                toFile.createNewFile();
            }
            InputStream inputStream = null;
            inputStream = file.getInputStream();// 获得输入流
            inputStreamToFile(inputStream, toFile);
            inputStream.close();
        }
        return toFile;
    }

    //获取流文件
    private static void inputStreamToFile(InputStream inputStream, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesReadLen = 0;
            byte[] buffer = new byte[8192];
            while ((bytesReadLen = inputStream.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesReadLen);
            }
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


/**
 * byte[] getBytes()：获取文件数据
 * String getContentType[]：获取文件MIME类型，如image/jpeg等
 * InputStream getInputStream()：获取文件流
 * String getName()：获取表单中文件组件的名字
 * String getOriginalFilename()：获取上传文件的原名
 * Long getSize()：获取文件的字节大小，单位为byte
 * boolean isEmpty()：是否有上传文件
 * void transferTo(File dest)：将上传文件保存到一个目录文件中
 */